package com.sfy.mallchat.common.common.exception;

import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.MethodArgumentNotValidException;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RestControllerAdvice;
import com.sfy.mallchat.common.common.domain.ApiResult;

@RestControllerAdvice
@Slf4j
public class GlobalExceptionHandler {
    /**
     * 处理方法参数无效异常
     * 当请求中的参数不符合要求时，会抛出MethodArgumentNotValidException异常，此方法用于处理该异常
     * 它会收集所有不符合要求的参数及其错误信息，并返回一个包含这些错误信息的ApiResult对象
     *
     * @param e MethodArgumentNotValidException异常对象，包含请求中所有不符合要求的参数及其错误信息
     * @return 返回一个ApiResult对象，其中包含状态标识符null和包含所有参数错误信息的字符串
     */
    @ExceptionHandler(value = MethodArgumentNotValidException.class)
    public ApiResult<?> methodArgumentNotValidException(MethodArgumentNotValidException e) {
        // 构建错误信息字符串
        StringBuilder errorMsg = new StringBuilder();
        // 遍历所有字段错误，将其添加到错误信息字符串中
        e.getBindingResult().getFieldErrors().forEach(x->errorMsg.append(x.getField()).append(x.getDefaultMessage())
                .append(","));
        // 移除最后一个多余的逗号
        String msg = errorMsg.toString().substring(0, errorMsg.length() - 1);
        // 返回包含错误信息的ApiResult对象，表示请求失败
        return ApiResult.fail(CommonErrorEnum.PARAM_ERROR.getCode(), msg);
    }

    @ExceptionHandler(value = Throwable.class)
    public ApiResult<?> handleException(Throwable e) {
        log.error("系统异常", e);
        return ApiResult.fail(CommonErrorEnum.SYSTEM_ERROR);
    }


    /**
     * 业务异常
     * @param e
     * @return
     */
    @ExceptionHandler(value = BusinessException.class)
    public ApiResult<?> businessException(BusinessException e) {
        log.info("业务异常", e);
        return ApiResult.fail(e.getErrorCode(), e.getErrorMsg());
    }
}
